package java_liaoxuefeng;

import sun.plugin2.main.client.MacOSXKeyHandler;

import java.util.Arrays;

public class Intro {

    public static void main(String[] args) {
        printClassInfo("".getClass());
//        printClassInfo(Runnable.class);
//        printClassInfo(java.time.Month.class);
        printClassInfo(String[].class);
        printClassInfo(int.class);
        printClassInfo(MacOSXKeyHandler.Listener.class);


        // 获取String的Class实例:
        Class cls = String.class;
// 创建一个String实例:
        try {
            String s = (String) cls.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
//        上述代码相当于new String()。通过Class.newInstance()可以创建类实例，它的局限是：
//        只能调用public的无参数构造方法。带参数的构造方法，或者非public的构造方法都
//        无法通过Class.newInstance()被调用。

//        Field getField(name)：根据字段名获取某个public的field（包括父类）
//        Field getDeclaredField(name)：根据字段名获取当前类的某个field（不包括父类）
//        Field[] getFields()：获取所有public的field（包括父类）
//        Field[] getDeclaredFields()：获取当前类的所有field（不包括父类）

//        Field
//        f.setAccessible(true);
    }

    static void printClassInfo(Class cls) {
        System.out.println("_______________________________");
        System.out.println("Class name: " + cls.getName());
        System.out.println("Simple name: " + cls.getSimpleName());
        if (cls.getPackage() != null) {
            System.out.println("Package name: " + cls.getPackage().getName());
        }
        System.out.println("is interface: " + cls.isInterface());
        System.out.println("is enum: " + cls.isEnum());
        System.out.println("is array: " + cls.isArray());
        System.out.println("is primitive: " + cls.isPrimitive());
        System.out.println("################################");
        System.out.println("cls. getFields: " + Arrays.toString(cls.getFields()));

        System.out.println("_______________________________");
    }
}
